/*
 * 实体管理器类。
 * 使用 findEntityByID 通过 ID 寻找实体。
 * 使用 get<typename> 创造一个对应类的实体。
 * 使用 findActorByPos 根据位置寻找实体。
 */

#ifndef AI9_LOGIC_2017_ENTITYMANAGER_H
#define AI9_LOGIC_2017_ENTITYMANAGER_H

#include "entity.h"
#include <map>
#include "sdk/point.h"
class Game;
class Actor;
class EntityManager{
public:
    Game *g;
    std::map<std::string, Entity*> entityList;
    EntityManager();
    EntityManager(Game* g);

    virtual ~EntityManager();

    Entity* findEntityByID(const std::string &ID); // return nullptr on failure
    int count;
    template<class T> inline T* get() {
        Entity* f = dynamic_cast<Entity*>(new T);
        f->id = f->prefix + std::to_string(count ++);
        f->g = g;
        entityList.insert(std::make_pair(f->id, f));
        return dynamic_cast<T*>(f);
    };

    std::map<Point, Actor*> actorMap;
    void setPos(Actor* actor, Point p);
    Actor* findActorByPos(Point p); // return nullptr on failure

    void clear();
};
#endif //AI9_LOGIC_2017_ENTITYMANAGER_H
